package com.generic.mixed.type.demo3;

/**
 * 就是在动态代理类内部使用一个Map，这个Map保存了所有的被代理对象及其对应的方法，而代理对象会成为所有被代理的超类，
 * 从而可以很方便的将代理对象变化成任何被代理对象，达到模拟混型的效果。
 * 
 * 他的局限性在于 1） 我们是通过方法名来判断需要调用的被代理对象的实例是哪一个，如果不同的被代理对象存在重复的方法名，则只能调用第一个被代理对象的方法；
 * 2）需要我们显式地向下转型去把代理对象变为一个被代理对象，这并非一种强约束。
 * 
 * @author Administrator
 *
 */
public class Demo {

	public static void main(String[] args) {
		// 生成混型对象
		Object proxy = ProxyClass.newInstance(new TwoTuple(new Extend1Impl(),
				Extend1.class), new TwoTuple(new Extend2Impl(), Extend2.class));

		// 混型向下转型为不同的类型
		Extend1 ext1 = (Extend1) proxy;
		Extend2 ext2 = (Extend2) proxy;
		ext1.ext1Func();
		ext2.ext2Func();
	}
}
